Claude Codeのヤバい挙動
モデルはClaude Sonnet 4を利用している
基本的に便利ということを前提として、予防する必要があるべき変な挙動もする
from ✅HAMPU: idとslugは共通にできる?→できない
localのmigrationが失敗したのでlocal向けにスクリプトを作って成功。成功したから削除してproductionには元のスクリプトを適用しようとする(明らかに失敗する)
テーブルの予備替えをアプリケーションで行った後、そのアプリケーションデプロイ前にテーブルの削除をしようとする
まだこういう挙動を利用者が制御できる必要がある
将来的には制御を監視するLLMと実行するLLMに別れたりするのかな?
importをIMPORTと書く
テストを通そうとしてテストむけの分岐を増やそうとする
fallbackをやたら増やそうとする(仕様の理解と確認が複雑になる)
テストが落ちているのに「期待される結果です」と言って無視しようとする
mainブランチに直pushしようとする
branch protectionが使えない環境(無料private)で問題となる
code:ts
// 無理やりテストを通そうとしてunknownを使う
expect(() => ItemId.of(null as unknown as string)).toThrow('ItemId must be string or number');
});
// 正しくはこう。@ts-expect-error を使用する方が適切
// TypeScriptに「この行はエラーになることを期待している」と伝える
expect(() => {
// @ts-expect-error Testing invalid input intentionally
ItemId.of(null);
}).toThrow('ItemId must be string or number');
これハマり始めると本当によくやる。
テストを通すテストを書く
OpenAIのAPI仕様が古くて昔の情報ばっかり使ってくる
GPT-5系を正しく利用できない
tempretureをつけたり、非推奨のパラメーターをつけたり、gpt-5は存在しないと主張する
https://context7.com/websites/platform_openai
context7
$ claude mcp add -s project --transport http context7 https://mcp.context7.com/mcp --header "CONTEXT7_API_KEY: YOUR_API_KEY"
対策
自動でチェックできるような仕組みを整えておく
テスト・linter
変更に必要な情報を小さく保つ